package com.testing.sunnycommon.aspect;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.testing.sunnycommon.annotations.SunnyAdvice;
import com.testing.sunnycommon.model.Result;
import com.testing.sunnycommon.model.SunnyNotice;
import com.testing.sunnycommon.service.SunnyNoticeService;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @Classname NoticeAspect
 * @Description 类型说明
 * @Date 2023/6/14 11:07
 * @Created by 特斯汀Roy
 */
@Aspect
@Component
public class NoticeAspect {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    SunnyNoticeService sunnyNoticeService;

    @Autowired
    SimpMessagingTemplate simpMessagingTemplate;

    //注解是需要进行使用的，获取其中的value值作为标题，returning返回也是需要使用的，获取result类型中的msg
    @AfterReturning(value = "@annotation(sunnyAdvice)", returning = "result")
    //上面定义的注解中的信息，就是下面的参数名
    public void doNoticeAfterReturning(SunnyAdvice sunnyAdvice, Result result) {
        //在sunnyAdvice注解的方法调用的时候，存储sunnyNotice信息
        SunnyNotice sunnyNotice = new SunnyNotice();
        sunnyNotice.setId(0L);
        sunnyNotice.setIsRead(false);
        //获取注解中的值，作为标题
        sunnyNotice.setTitle(sunnyAdvice.value());
        //获取result返回信息中的message作为具体内容
        sunnyNotice.setNotice(result.getMsg());
        sunnyNotice.setTime(LocalDateTime.now());
        sunnyNoticeService.save(sunnyNotice);


        //将消息发送到rabbitMQ对应的队列中。
        //设置交换机、routingkey和发送的信息

        try {
            String noticeJson = new ObjectMapper().writeValueAsString(sunnyNotice);
            System.out.println("正在向队列写入" + noticeJson);
            rabbitTemplate.convertAndSend("sunnyNotice", "sunnyNotice", noticeJson);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        //完成websocket的实时推送
//        simpMessagingTemplate.convertAndSend("/topic/notice",sunnyNotice);
    }


}
